<?php
namespace Helper;
use KF;

class kfRssi{
    private $A = 1; //状态转移参数
    private $H = 1; //观察变量
    private $Q = 50; //过程方差
    private $R = 10; //测量方差
    private $X = null; //初始变量
    private $P = 0.9; //初始方差
    private $B = null; //控制参数
    private $KF = null;
    static $time;
    function __construct(){
        self::$time = time();
    }
    
    function getLastCallTime(){
        return self::$time;
    }
    
    /**
     * 卡尔曼过滤RSSI信号
     * @date: 2017年11月15日 下午3:40:59
     * @author: ljn
     * @param:
     * @return:
     */
    public function kfRssi($z){
        if($this->KF == null)$this->creatKfObj($z);
        $o = $this->KF->Fitter(new \Phpml\Math\Matrix([$z]));
        self::$time = time();
        return $o[0][0];
    }

    /**
     * 创建卡尔曼对象
     * @date: 2017年11月15日 下午3:56:24
     * @author: ljn
     * @param:
     * @return:
     */
    function creatKfObj($z){
        $A = $this->creatMatrix($this->A);
        $H = $this->creatMatrix($this->H);
        $Q = $this->creatMatrix($this->Q);
        $R = $this->creatMatrix($this->R);
        $X = $this->creatMatrix($z);
        $P = $this->creatMatrix($this->P);
        $B = $this->B == null ? $this->B : $this->creatMatrix($this->B) ;
        $this->KF = new KF($A, $B, $H, $Q, $R, $X, $P);
    }

    /**
     * 创建矩阵
     * @date: 2017年11月15日 下午3:56:38
     * @author: ljn
     * @param:
     * @return:
     */
    function creatMatrix($d){
        return new \Phpml\Math\Matrix([$d]);
    }
}